// utils/auth.js
// 认证相关工具函数

const { post } = require('./api.js')
const { setStorage, getStorage, removeStorage, showError, showLoading, hideLoading, showSuccess } = require('./util.js')
const { sessionManager } = require('./session.js')
const { isDev, shouldSkipAuthentication, shouldBypassTokenCheck } = require('./config.js')

/**
 * WeChat登录
 */
const wechatLogin = () => {
  return new Promise((resolve, reject) => {
    showLoading('登录中...')
    
    wx.login({
      success: (loginRes) => {
        if (loginRes.code) {
          // 获取用户信息授权
          wx.getUserProfile({
            desc: '用于完善用户资料',
            success: (profileRes) => {
              // 发送登录请求到后端
              post('/api/auth/wechat-login', {
                code: loginRes.code,
                encryptedData: profileRes.encryptedData,
                iv: profileRes.iv,
                userInfo: profileRes.userInfo
              }).then((data) => {
                // 使用会话管理器保存会话信息
                sessionManager.saveSession(data)
                
                hideLoading()
                resolve(data)
              }).catch((error) => {
                hideLoading()
                console.error('微信登录API请求失败:', error)
                
                // 开发模式下显示详细错误信息
                if (isDev()) {
                  const errorMsg = error.message || error.errMsg || '未知错误'
                  showError(`登录失败: ${errorMsg}`)
                  console.log('错误详情:', {
                    url: '/api/auth/wechat-login',
                    error: error,
                    type: error.type || 'unknown'
                  })
                } else {
                  showError('登录失败，请重试')
                }
                
                reject(error)
              })
            },
            fail: (error) => {
              hideLoading()
              console.log('用户拒绝授权', error)
              // 用户拒绝授权，使用code登录
              post('/api/auth/wechat-login', {
                code: loginRes.code
              }).then((data) => {
                // 使用会话管理器保存会话信息
                sessionManager.saveSession(data)
                
                hideLoading()
                resolve(data)
              }).catch((error) => {
                hideLoading()
                showError('登录失败，请重试')
                reject(error)
              })
            }
          })
        } else {
          hideLoading()
          showError('微信登录失败')
          reject(new Error('微信登录失败'))
        }
      },
      fail: (error) => {
        hideLoading()
        showError('微信登录失败')
        reject(error)
      }
    })
  })
}

/**
 * 手机号验证登录
 */
const phoneLogin = (phone, verificationCode) => {
  return new Promise((resolve, reject) => {
    // 验证输入参数
    const { validatePhone } = require('./util.js')
    if (!validatePhone(phone)) {
      showError('手机号格式不正确')
      reject(new Error('手机号格式不正确'))
      return
    }

    if (!verificationCode || verificationCode.length !== 6) {
      showError('请输入6位验证码')
      reject(new Error('验证码格式不正确'))
      return
    }

    showLoading('验证中...')
    
    post('/api/auth/phone-verify', {
      phone,
      verificationCode
    }).then((data) => {
      // 使用会话管理器保存会话信息
      sessionManager.saveSession(data)
      
      hideLoading()
      resolve(data)
    }).catch((error) => {
      hideLoading()
      // 根据错误类型显示不同的错误信息
      if (error.message.includes('验证码')) {
        showError('验证码错误或已过期')
      } else if (error.message.includes('手机号')) {
        showError('手机号不存在')
      } else {
        showError('验证失败，请重试')
      }
      reject(error)
    })
  })
}

/**
 * 发送短信验证码
 */
const sendSmsCode = (phone) => {
  return new Promise((resolve, reject) => {
    // 验证手机号格式
    const { validatePhone } = require('./util.js')
    if (!validatePhone(phone)) {
      showError('手机号格式不正确')
      reject(new Error('手机号格式不正确'))
      return
    }

    post('/api/auth/send-sms', {
      phone
    }).then((data) => {
      resolve(data)
    }).catch((error) => {
      // 根据错误类型显示不同的错误信息
      if (error.message.includes('频率')) {
        showError('发送过于频繁，请稍后再试')
      } else if (error.message.includes('手机号')) {
        showError('手机号不存在或格式错误')
      } else {
        showError('发送验证码失败，请稍后重试')
      }
      reject(error)
    })
  })
}

/**
 * 检查登录状态
 */
const checkLoginStatus = () => {
  // 如果跳过认证，直接返回已登录状态
  if (shouldSkipAuthentication()) {
    console.warn('🚫 认证已屏蔽，直接返回已登录状态')
    return Promise.resolve(true)
  }
  
  // 使用会话管理器检查登录状态
  if (sessionManager.isLoggedIn()) {
    // 如果跳过Token检查，直接返回已登录
    if (shouldBypassTokenCheck()) {
      console.warn('🚫 Token检查已屏蔽，跳过验证')
      return Promise.resolve(true)
    }
    
    // 验证token有效性
    return post('/api/auth/verify-token').then((data) => {
      // 更新用户信息
      sessionManager.updateUserProfile(data.userProfile)
      return true
    }).catch((error) => {
      console.log('Token验证失败:', error)
      // 尝试刷新token
      return sessionManager.refreshToken().then(() => {
        return true
      }).catch(() => {
        // 刷新失败，清除登录状态
        clearLoginState()
        return false
      })
    })
  }
  
  return Promise.resolve(false)
}

/**
 * 清除登录状态（内部方法）
 */
const clearLoginState = () => {
  // 使用会话管理器清除会话
  sessionManager.clearSession()
}

/**
 * 退出登录
 */
const logout = () => {
  // 显示确认对话框
  wx.showModal({
    title: '确认退出',
    content: '确定要退出登录吗？',
    success: (res) => {
      if (res.confirm) {
        // 清除登录状态
        clearLoginState()
        
        // 使用路由工具跳转
        const { redirectAfterLogout } = require('./router.js')
        redirectAfterLogout()
      }
    }
  })
}

/**
 * 获取用户信息
 */
const getUserInfo = () => {
  return sessionManager.getUserInfo()
}

/**
 * 判断是否为新用户（需要创建头像）
 */
const isNewUser = () => {
  const userProfile = sessionManager.getUserProfile()
  return !userProfile || !userProfile.avatarConfig
}

/**
 * 自动登录检查
 */
const autoLogin = () => {
  return checkLoginStatus().then((isLoggedIn) => {
    if (isLoggedIn) {
      return {
        success: true,
        isNewUser: isNewUser()
      }
    } else {
      return {
        success: false,
        isNewUser: false
      }
    }
  }).catch(() => {
    return {
      success: false,
      isNewUser: false
    }
  })
}

module.exports = {
  wechatLogin,
  phoneLogin,
  sendSmsCode,
  checkLoginStatus,
  logout,
  getUserInfo,
  isNewUser,
  autoLogin,
  clearLoginState
}